import router from '@/router/index'
import { useUserStore } from '@/store/user'
import { addDynamicRoutes, transformRoutes } from '@/router/dynamic'
import { ElLoading } from 'element-plus'

let loadingInstance = null

// 显示全局加载
function showLoading(text = '加载中...') {
  if (loadingInstance) {
    loadingInstance.close()
  }
  
  loadingInstance = ElLoading.service({
    lock: true,
    text: text,
    background: 'rgba(0, 0, 0, 0.7)',
    customClass: 'global-loading'
  })
  
  return loadingInstance
}

// 隐藏全局加载
function hideLoading() {
  if (loadingInstance) {
    loadingInstance.close()
    loadingInstance = null
  }
}

// 设置加载文本
function setLoadingText(text) {
  if (loadingInstance) {
    loadingInstance.setText(text)
  }
}

// 路由守卫（修复后）
router.beforeEach(async (to, from, next) => { // 改为 async 函数
  const userStore = useUserStore();
  const isLoggedIn = userStore.isLoggedIn;

  if (to.path !== from.path) {
    showLoading('页面加载中...');
  }

  // 未登录：跳登录页
  if (to.path !== '/login' && !isLoggedIn) {
    hideLoading();
    return next('/login');
  }

  // 已登录访问登录页：跳首页
  if (to.path === '/login' && isLoggedIn) {
    hideLoading();
    return next('/');
  }

  // 已登录且需要加载动态路由
  if (isLoggedIn && userStore.routers.length === 0 && !userStore.noHasDynamicRouters) {
    try {
      setLoadingText('正在加载用户权限...');
      // 等待用户信息加载（若失败会进入 catch）
      const userResponse = await userStore.fetchUserInfo(); 
      
      setLoadingText('正在加载菜单数据...');
      // 等待路由加载（若失败会进入 catch）
      const routers = await userStore.fetchRouters(); 
      
      setLoadingText('正在初始化页面...');
      const transformedRoutes = transformRoutes(routers);
      addDynamicRoutes(router, transformedRoutes);
      userStore.noHasDynamicRouters = true;

      hideLoading();
      return next({ ...to, replace: true });
    } catch (error) {
      // 任何一步失败（如401），都强制登出并跳登录页
      console.log('加载动态路由出错', error);
      userStore.logout(); // 确保清除状态
      hideLoading();
      return next('/login'); // 终止后续逻辑，跳登录页
    }
  }

  // 已加载路由：直接放行
  hideLoading();
  next();
});

// 路由切换完成后隐藏加载
router.afterEach(() => {
  hideLoading()
}) 